package modes

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"github.com/go-xorm/xorm"

	"../../db"
	"../../router/middleware"
)

func Db(index int) *xorm.Engine {
	return db.UseHand(index)
}

/*
 * 描述: 打印Jwt结构
 *
 ***********************************************************************/
func PrintJwt(c *gin.Context, fage string) {
	user := c.MustGet("claims").(*middleware.CustomClaims)
	fmt.Println("============\t\t", fage, "\t============================")
	fmt.Println("用户昵称:", user.Phone)
	fmt.Println("用户标示:", user.Id)
}

/*
 * 描述: 返回Jwt结构
 *
 ***********************************************************************/
func JwtUser(c *gin.Context) *middleware.CustomClaims {
	return c.MustGet("claims").(*middleware.CustomClaims)
}

/*
 * 描述: 数据列表结构
 *
 ***********************************************************************/

type PagerTime struct {
	Start     int         `json:"start"`     // 开始时间
	End       int         `json:"end"`       // 结束时间
	Count     int         `json:"count"`     // 单页数量
	Page      int         `json:"page"`      // 页码
	Total     int64       `json:"total"`     // 本条件的总数量
	Collatoin int         `json:"collation"` // 排序字段
	Rules     int         `json:"rules"`     // true 从小到大排序，false 从大到小排序
	List      interface{} `json:"list"`      // 数据列表
	TName     string      `json:"-"`         // 表名
	Where     []sql_where `json:"-"`         //
}

func PIdWhere(id int64) (int64, int64) {
	if id == 0 {
		return 0, 9999999999
	}
	POne := id % 1000
	if POne != 0 {
		return id, id
	}
	PTow := (id % 1000000) / 1000
	if PTow != 0 {
		return id, id + 1000
	}
	return id, id + 1000000
}

func RIdWhere(id int64) (int64, int64, int64) {

	if (id % 1000000) > 0 {
		return id, id + 100000, 100000
	}
	return id, id + 100000, 100000
}

type sql_where struct {
	Key  string `json:"key"`   // Key
	Fage string `json:"-"`     // 符号 =, >, <
	Tage string `json:"-"`     // 条件 or, and
	Val  string `json:"value"` // value
}

type Pager struct {
	Count int         `json:"count"`     // 单页数量
	Page  int         `json:"page"`      // 页码
	Total int64       `json:"total"`     // 本条件的总数量
	Coll  int         `json:"collation"` // 排序字段
	Rules int         `json:"rules"`     // true 从小到大排序，false 从大到小排序
	List  interface{} `json:"list"`      // 数据列表
	TName string      `json:"-"`         // 表名
	Where []sql_where `json:"-"`         //
}

func (this *Pager) Add(key, fage, tage, val string) {
	this.Where = append(this.Where, sql_where{key, fage, tage, val})
}

func (this *Pager) IdArea(field string, id int64) {
	sid, eid := PIdWhere(id)
	this.Where = append(this.Where, sql_where{field, ">=", "", fmt.Sprintf("%d", sid)})
	this.Where = append(this.Where, sql_where{field, "<", "and", fmt.Sprintf("%d", eid)})
}

func (this *Pager) Exist(key string) bool {
	for _, v := range this.Where {
		if v.Key == key {
			return true
		}
	}
	return false
}

func (this *Pager) GetValue(key string) string {
	for _, v := range this.Where {
		if v.Key == key {
			return v.Val
		}
	}
	return ""
}

func (this *Pager) ToWhere() string {
	var key, where string
	if len(this.Where) > 0 {
		key = fmt.Sprintf("%s.%s", this.TName, this.Where[0].Key)
		where = fmt.Sprintf("%s %s %s ", key, this.Where[0].Fage, this.Where[0].Val)
		for _, v := range this.Where[1:] {
			key = fmt.Sprintf("%s.%s", this.TName, v.Key)
			where = fmt.Sprintf("%s %s %s %s %s ", where, v.Tage, key, v.Fage, v.Val)
		}
	}
	return where
}

func (this *PagerTime) ToWhere() string {
	var key, where string
	if len(this.Where) > 0 {
		key = fmt.Sprintf("%s.%s", this.TName, this.Where[0].Key)
		where = fmt.Sprintf("%s %s %s ", key, this.Where[0].Fage, this.Where[0].Val)
		for _, v := range this.Where[1:] {
			key = fmt.Sprintf("%s.%s", this.TName, v.Key)
			where = fmt.Sprintf("%s %s %s %s %s ", where, v.Tage, key, v.Fage, v.Val)
		}
	}
	return where
}

// ------------ PageFields
type PageFields struct {
	Pnum  int `form:"pnum" json:"pnum" binding:"required,min=3"` // 单页数量
	Page  int `form:"page" json:"page" binding:"required"`       // 页码(默认0)
	Order int `form:"order" json:"order" binding:"omitempty"`    // 排序字段(0 默认排序)
	ORule int `form:"orule" json:"orule" binding:"omitempty"`    // 0:正序; 1:倒序;
}

func MapKeys(m map[int64]int) []int64 {
	keys := make([]int64, 0, len(m))
	for k := range m {
		keys = append(keys, k)
	}
	return keys
}
